/**
 * 路由拦截器 - 登录拦截
 * 采用黑名单模式（大部分页面不需要登录，特定页面需要登录）
 */
import { useUserStore } from '@/store'
import { needLoginPages as _needLoginPages, getNeedLoginPages, getLastPage, getUrlObj } from '@/utils'

// 登录页路由
const loginRoute = '/pages/Login/index'

// 检查登录状态
// 检查登录状态
const isLogined = (url?: string) => {
	const userStore = useUserStore()
	if (location) {
		try {
			const urlObj = new URL(location)
			if (urlObj.searchParams.get('code')) {
				return 'processing' // 特殊状态：正在处理 code
			}
		} catch (e) {
			console.warn('Invalid URL:', url)
		}
	}
	return userStore.isLogined
}

// 环境判断
const isDev = import.meta.env.DEV

/**
 * 路由拦截处理
 */
const navigateToInterceptor = {
	
  invoke({ url } : { url : string }) {
     const loginStatus = isLogined(url)
    // 如果正在处理code，直接放行
    if (loginStatus === 'processing') {
      return true
    }
    // 如果是登录页本身，直接放行
    const path = url.split('?')[0]
    if (path === loginRoute) {
      return true
    }
    // 获取需要登录的页面列表
    const needLoginPages = _needLoginPages
    // 检查当前页面是否需要登录
    const isNeedLogin = needLoginPages.includes(path)
    if (!isNeedLogin) {
      return true
    }
    // 已登录直接放行
    if (loginStatus === true) {
      return true
    }
    // 未登录跳转到登录页，并携带重定向路径
    const redirectRoute = `${loginRoute}?redirect=${encodeURIComponent(url)}`
    uni.reLaunch({ url: redirectRoute })
    return false
  }
}

/**
 * 应用启动时检查初始页面
 */
const checkInitialPage = () => {
	// 开发环境下不检查初始页面
	// if (isDev) {
	//   return
	// }

	// 获取当前页面栈
	const pages = getCurrentPages()

	// 如果页面栈为空（首次启动）
	if (pages.length === 0) {
		const hasLogin = isLogined()
		if (!hasLogin) {
			// 未登录则重定向到登录页
			uni.reLaunch({ url: loginRoute })
			return
		}
		// 已登录则不做处理，会进入pages.config.ts中定义的第一个页面
		return
	}

	// 如果当前页面不是登录页且未登录
	const currentPage = pages[pages.length - 1]
	if (!isLogined() && currentPage.route !== 'pages/Login/index') {
		uni.reLaunch({ url: loginRoute })
	}
}

/**
 * 路由拦截器安装
 */
export const routeInterceptor = {
	install() {
		// 安装时先检查初始页面
		checkInitialPage()
		// 添加各种路由方法的拦截器
		uni.addInterceptor('navigateTo', navigateToInterceptor)
		uni.addInterceptor('reLaunch', navigateToInterceptor)
		uni.addInterceptor('redirectTo', navigateToInterceptor)
		uni.addInterceptor('switchTab', navigateToInterceptor)
		// 监听应用生命周期
		uni.onAppShow((options) => {
			// 开发环境下不检查
			// if (isDev) {
			// 	return
			// }

			// 从后台切回前台时检查登录状态
			if (!isLogined() && options.path !== loginRoute) {
				const { path } = getUrlObj(options.path)
				if (!_needLoginPages.includes(path)) {
					uni.reLaunch({ url: loginRoute })
				}
			}
		})
	}
}